#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_log.h"

#include "esp_system.h"
#include "esp_check.h"
#include "nvs_flash.h"

#include "app_audio.h"
#include "settings.h"
#include "app_uart.h"
#include "app_led.h"
#include "app_wifi.h"
#include "app_sr.h"
#include "bsp_keyboard.h"
#include "keyboard.h"

#include "app_espnow.h"
#include "app_udp_client.h"
#include "app_ble_hid.h"
#include "app_tusb_hid.h"

void app_main(void)
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    bsp_power_init();
    settings_read_parameter_from_nvs();
    bsp_keyboard_init();
    app_network_start();
    app_uart_init();
    sys_param_t *param = settings_get_parameter();
    switch (param->mode_hid)
    {
    case MODE_HID_USB:
        ESP_LOGI("app_main", "MODE_HID_USB");
        app_tusb_hid_init();
        break;
    case MODE_HID_BLE:
        ESP_LOGI("app_main", "MODE_HID_BLE");
        app_ble_hid_init();
        break;
    case MODE_HID_ESPNOW:
        ESP_LOGI("app_main", "MODE_HID_ESPNOW");
        app_espnow_init();
        break;
    case MODE_HID_UDP:
        ESP_LOGI("app_main", "MODE_HID_UDP");
        break;
    default:
        break;
    }
    keyboardStart();
    app_sr_start();
    appLedStart();
    vTaskDelay(pdMS_TO_TICKS(500));
    audio_play_filepath("/spiffs/powerOn.mp3");
}

#if 0

void print_chip_info(void)
{
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

    unsigned major_rev = chip_info.revision / 100;
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if (esp_flash_get_size(NULL, &flash_size) != ESP_OK)
    {
        printf("Get flash size failed");
        return;
    }

    printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());
}

#endif